//  /=============================================================/
//  |   Auteurs  : J.JULLIEN / R.HERLEMAN / R.CHAILAN             |
//  |   Fichier  : litteral.h                                     |
//  |   Date     : 11/04/2009                                     |
//  |   Objet    : Spécification du type "t_Litteral" &           |
//  |              ses fonctions associées                        |
//  /=============================================================/

#ifndef LITTERAL_H
#define LITTERAL_H

#include <stdio.h>
#include <stdlib.h> 

/* ------------------------------------------------------------------------ */
/* ---------------------- Déclaration types exportés ---------------------- */
/* ------------------------------------------------------------------------ */

typedef struct t_Litteral {
  int clause;
  int variable;
  int litteral;                    // >0:positif sinon négatif

  struct t_Litteral *clauseSuiv;   // Clause suivante dans la matrice creuse
  struct t_Litteral *variableSuiv; // Variable suivante dans la matrice creuse
} t_Litteral;

/* ------------------------------------------------------------------------ */
/* -------------------- Déclaration fonctions exportés -------------------- */
/* ------------------------------------------------------------------------ */

/*----------------------------------------------------------------------------
Nom              : litteralInit
Prérequis        : variable est bien un numéro de variable existant et clause
                   un numéro de clause existant
Action           : Retourne un pointeur sur une litteral dont tous les champs
                   sont initialisés.
Type de retour   : t_Variable
Variable(s)      :  
  E   char   s - Signe du litteral : '+' ou '-'
  E   int    clause - Numéro de la clause
  E   int    variable - Numéro de la variable
----------------------------------------------------------------------------*/
t_Litteral* litteralInit (char s, int clause, int variable);

/*----------------------------------------------------------------------------
Nom              : litteralGetValeur
Prérequis        : -
Action           : Retourne la valeur du litteral lit
Type de retour   : int
Variable(s)      :
  E   T_Litteral   lit - Le litteral à afficher
  E   int          val - valeur de la variable
----------------------------------------------------------------------------*/
int litteralGetValeur (t_Litteral lit, int val);

/*----------------------------------------------------------------------------
Nom              : litteralAfficherSigne
Prérequis        : -
Action           : Affiche le signe (+/-) du litteral lit
Type de retour   : -
Variable(s)      :
  E   T_Litteral   lit - Le litteral à afficher
----------------------------------------------------------------------------*/
void litteralAfficherSigne (t_Litteral lit);

/*----------------------------------------------------------------------------
Nom              : litteralAfficherPredicat
Prérequis        : -
Action           : Affiche le prédicat entier, sous la forme [non]Xi où "i"
                   est le numéro de la variable.
Type de retour   : -
Variable(s)      :
  E   T_Litteral   lit - Le litteral à afficher
----------------------------------------------------------------------------*/
void litteralAfficherPredicat (t_Litteral lit);

/*----------------------------------------------------------------------------
Nom              : litteralAfficherDebug
Prérequis        : -
Action           : Affiche les informations détaillées d'un litteral
Type de retour   : -
Variable(s)      :
  E   T_Litteral   lit - Le litteral à afficher
  E   int          avecValeur - affichage de la valeur du litteral si 1
  E   int          val - valeur de la variable, affiché si avecValeur == 1
----------------------------------------------------------------------------*/
void litteralAfficherDebug (t_Litteral lit, int avecValeur, int val);

#endif
